package com.visitor.demo2;

import com.visitor.demo1.impl.NodeA;
import com.visitor.demo1.impl.NodeB;
import com.visitor.demo2.impl.AddGraphicVisitor;
import com.visitor.demo2.impl.MyCircle;
import com.visitor.demo2.impl.MyRectangle;
import com.visitor.demo2.impl.MyRegularTriangle;
import com.visitor.demo2.impl.RotateGraphicVisitor;

/**
 * 适用性：
1.一个对象结构包含很多类对象，它们有不同的接口，而你想对这些对象实施一些依赖于其具体类的操作
2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时，用Visitor模式让每个应用仅包含需要用到的操作
3.定义对象结构的类很少改变，但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口，这可能需要很大的代价
 * @author DELL
 *
 */
public class VisitorTest
{

	private static Context ctx = new Context();

    public static void main(String args[])
    {
    	MyGraphic mc = new MyCircle();
    	MyGraphic mr = new MyRectangle();
    	MyGraphic mrt = new MyRegularTriangle();
        GraphicVisitor addvisitor = new AddGraphicVisitor();
        GraphicVisitor rotatevisitor = new RotateGraphicVisitor();

        ctx.add(mc);
		ctx.add(mr);
		ctx.add(mrt);

		ctx.visit(addvisitor);
		System.out.println("------------");

        mc.angle = 30;
        mr.angle = 60;
        mrt.angle = 90;
        ctx.visit(rotatevisitor);
    }
}